#ifndef __SCRIPT_STACK_H__
#define __SCRIPT_STACK_H__

#define STACK_ERROR_PARAM_NULL -1
#define STACK_ERROR_NO_MEMORY -2
#include <pthread.h>

#define STACK_DEFAULT_SIZE 10

typedef enum {
	STACK_DESTROY_NONEED_EMPTY = 0,
	STACK_DESTROY_NEED_EMPTY = 1
}script_stack_destroy_flag;

typedef struct script_stack{
	char	forcs_destroy:1;	//销毁栈时是否检查空栈 1:检查
	int  scale;
	int size;
	void **datas;
}script_stack_t;

/********************************************************
 *	function	script_stack_create
 *		创建堆栈
 *	@forcs_destroy		
 *		强制销毁标记, 
 *		1: 当stack不为空时调用script_stack_destroy将返回失败，
 *			stack不会被销毁
 *	return 
 *		成功返回stack句柄
 *		失败返回NULL
 *
 * ******************************************************/
script_stack_t *script_stack_create(script_stack_destroy_flag forcs_destroy);

/********************************************************
 *	function	script_stack_destroy
 *		销毁堆栈	
 *	@stack 
 *		堆栈句柄
 *
 *	return	
 *		
 *
 * ******************************************************/
int script_stack_destroy(script_stack_t *stack);

/********************************************************
 *
 * ******************************************************/
int script_stack_force_destroy(script_stack_t *stack);

/********************************************************
 *
 * ******************************************************/
int script_stack_num_get(script_stack_t *stack);

/********************************************************
 *
 * ******************************************************/
void *script_stack_Top(script_stack_t *stack);

/********************************************************
 *
 * ******************************************************/
void *script_stack_Pop(script_stack_t *stack);

/********************************************************
 *
 * ******************************************************/
int script_stack_Push(script_stack_t *stack,void *data);

/********************************************************
 *
 * ******************************************************/
int script_stack_IsEmpty(script_stack_t *stack);

/********************************************************
 *	function script_stack_get
 *		获取栈数据
 *	@stack: 栈句柄
 *	@num:	栈下标， 可以为负数。 
 *		num == 0 是栈低
 *		num == -1 是栈顶
 *
 *  @return:  返回栈数据
 * ******************************************************/
void *script_stack_get(script_stack_t *stack,int num);



#endif
